"""
定义函数
必须先定义后调用
"""


def sel_func():
    print('显示余额')
    print('存款')
    print('取款')


print('恭喜你登录成功')
sel_func()

"""
两数相加
"""
import random


def add_mun(a, b):
    return a + b


print(add_mun(random.randint(0, 10), random.randint(0, 10)))

"""
函数的说明文档
help()查看函数说明文档
自定义函数说明文档
"""
help(len)


def add_mun(a, b):
    """
    求和函数
    :param a:
    :param b:
    :return:
    """
    return a + b


help(add_mun)

"""
函数的嵌套调用
"""


def testb():
    print('B调用开始======')
    print('B调用结束======')


def teata():
    print('A调用开始======')
    testb()
    print('A调用结束======')


teata()

"""
修改全局变量
global声明
"""

a = 100


def teatA():
    print(a)


def teatB():
    global a
    a = 200
    print(a)


teatA()
teatB()
print(a)

"""
返回值作参数返回
"""


def test1():
    return 50


def test2(numbers):
    print(numbers)


test2(test1())

"""
关键字参数
"""


def user_info(name, age, gender):
    print(f'您的名字时{name}，您的年龄{age}，性别为{gender}')


user_info('小明', gender='男', age=18)

"""
缺省参数(所有参数应该在缺省参数之前)
"""


def user_info(name, age, gender='男'):
    print(f'您的名字时{name}，您的年龄{age}，性别为{gender}')


user_info('小明', age=18)

user_info('小明', age=18, gender='女')

"""
不定长参数
包裹位置传递(返回元组)
包裹关键字传递
"""


def user_info1(*args):
    print(args)


user_info1('TOM')
user_info1('TOM', '18')


def user_info2(**kwargs):
    print(kwargs)


user_info2(name='小明', age=18, gender='女')

"""
拆包
拆包元组数据
拆包字典数据
"""


def return_num():
    return 100, 200


result = return_num()
print(result)
result1, result2 = return_num()
print(result1)
print(result2)

dict1 = {'name': '小明', 'age': 18}
a, b = dict1  # 字典拆包返回值为字典的key
print(a)
print(b)
print(dict1[a])
print(dict1[b])

"""
交换变量值
方法一：借助第三个变量
方法二：交换赋值
"""
a = 1
b = 2
c = a
a = b
b = c
print(a)
print(b)

a, b = 1, 2
a, b = b, a
print(a)
print(b)

"""
引用:python中值都是靠引用传递的
id(变量)返回变量在内存中的内存地址(10进制)
"""
# 1.整型
a = 3
b = a
print(b)
print(id(a))
print(id(b))  # a,b地址一致

a = 4
print(b)
print(id(a))
print(id(b))  # a,b地址不一致,a开辟了新地址,b仍然为之前的地址

a = 5
b = 5
print(id(a))
print(id(b))  # a,b地址一致

# 2.列表
aa = [10, 20]
bb = aa
print(id(aa))
print(id(bb))  # aa,bb地址一致

aa.append(30)
print(aa)
print(bb)  # aa,bb值一致
print(id(aa))
print(id(bb))  # aa,bb地址一致,列表作为可变数据类型,引用传递数据使得双方的地址一致,导致值同时修改


# 引用当作实参传递
def test1(a):
    print(a)
    print(id(a))
    a += a
    print(a)
    print(id(a))


b = 100
print(id(b))
test1(b)

c = [11, 22]
print(id(c))
test1(c)
